﻿/*
 DROPSUPPLY.SQF
 ==============
 © Pumpkin

 Script lancé par "AirDropping.sqf"; gère la chute du matériel et l'attachement au parachute

 Paramètres :
 ------------
 nul = [materiel, position d'apparition] execVM "DropSupply.sqf"

 1. matériel : le matériel à larger
 2. position d'apparition "en l'air" du matériel largué (un peu à l'arrière et sous l'avion)

*/

_supply = _this select 0;
_largpos = _this select 1;
_temp = _this select 2;

_supply setdamage 0;
_supply allowDammage false;

// Gestion des marqueurs "dot" de chaque marchandise
_mkname = "matos1";
_mkcnt = 1;
while {getmarkertype _mkname != ""} do {
	_mkcnt = _mkcnt + 1;
	_mkname = format ["matos%1",_mkcnt];
};
createMarker [_mkname, _largpos];
_mkname setMarkerType "Dot";
_mkname setMarkerColor "ColorRed";
_mkname setMarkerSize [1,1];

// Création du parachute
diag_log Format["Reached Parachute Creation"];
_paratype = "ParachuteBigWest";
if (_supply isKindOf "Static") then { _paratype = "ParachuteMediumWest" };
_para = _paratype createvehicle _largpos;
_para setpos [_largpos select 0, _largpos select 1, _largpos select 2];
_para setcaptive true;
_para allowDammage false;
diag_log Format["Parachute Created: %1", getPos _para];
// Attente afin de laisser le temps à l'avion d'avancer un peu
sleep 0.1;

// La Commande AttachTo ne fonctionne pas si le vehicle à attacher est trop éloigné.
// Détermination d'une position SOUS le parachute et téléportation du vehicle
_baspara = ((boundingBox _para select 0) select 2);
waituntil{(getpos _para select 2) > 0};
sleep 0.1;
_distmini = abs _baspara + 0.2;

// Bug dans ArmA2 : après attachTo, l'accés aux caisses de munition est impossible, donc
// création temporaire d'objet identique et déplacement de l'original sur position finale
_utype = format ["%1",typeof _supply];
_newsupply = _utype createvehicle [0,0,0];
hintsilent Format["%1 / %2", getpos _para, round(speed _para)];
_iBlockedCount = 0;
_oldalt = 0;
_isBlocked = False;
// tant que le parachute est au-dessus de 5m (évite tremblement de l'objet), boucler
while { ((getpos _para select 2) > 5) And (!_isBlocked)} do {
	_alt = getpos _para select 2;
	hintsilent Format["%1 / %2 / %3", getpos _para, round(speed _para), _iBlockedCount];
	// This check allows for dropping the supply when the chute is blocked by trees or other things.
	If ((_iBlockedCount > 100) And (speed _para < 1)) then {
		_isBlocked = True;
	};
	// Correction bug de la commande AttachTo, qui n'accroche pas : vérification multiple, si objet reste au sol, (re)faire l'accroche
	if ((getpos _newsupply select 2) < 1) then {
		//_alt = (getpos _para select 2) - _distmini;
		_newsupply setpos [(getpos _para select 0), (getpos _para select 1), _alt];
		_newsupply attachTo [_para,[0,0,0]];
	};
	If ((floor _oldalt) == (floor _alt)) then {
		_iBlockedCount = _iBlockedCount + 1;
	} else {
		_iBlockedCount = 0;
	};
	_oldalt = _alt;
	sleep 0.05;
};

detach _newsupply;
_finalpos = [(getpos _newsupply select 0), (getpos _newsupply select 1), 0];
deletevehicle _newsupply;

_supply setpos _finalpos;
_mkname setMarkerPos _finalpos;

sleep 0.5;
_supply allowDammage true;

If (((getpos _para select 2) > 5) And (!isNil("_para"))) then {
	deleteVehicle _para;
};

_t = 0;
while { true } do {
	// Pas un véhicule et marqueur permanent => sortie simple
	//if ( (not (_supply isKindOf "AllVehicles")) and (_temp < 0) ) exitwith {};
	// Véhicule et passagers => sortie effacement
	//if ( (_supply isKindOf "AllVehicles") and ((count crew _supply) > 0) ) exitwith { deletemarker _mkname };

	// Timeout atteint => sortie effacement
	if ( (_t > _temp) and (_temp >= 0) ) exitwith { deletemarker _mkname };
	// Cargo déplacé (nouveau largage ou déplacement du véhicule) => sortie effacement
	if ( (_supply distance _finalpos) > 10 ) exitwith { deletemarker _mkname };

	// Anti-lag : timeout max de 15mn, ensuite le marqueur restera "ad eternam" => sortie simple
	if (_t > 900) exitwith {};

	sleep 2;
	_t = _t + 2;

};
